# python 每个语句是一行
print('hello')

# python 中的变量不需要声明，直接使用即可，但是变量必须有赋值才能使用，不能直接使用未赋值的变量
a = 123
print(a)
# python 中的变量类型根据赋值自动确定，是动态类型, 但是python是强类型语言
a = 'hello world'
print(a)

# python 中的整数没有大小限制, **是次方
a = 100 ** 100

# 长数字可以用下划线分割，还是一个完整数字
a = 1233434534_232423_345345
print(a)

# 浮点类型, 浮点类型对于高精度计算不要使用，存在精度问题，可以通过其他工具包进行高精度运算
a = 1.1
print(a)

# 多行语句使用反斜杠 \
print('hello\
world')
# 字符串可以使用单引号或双引号
s = "hello world"
# 字符串换行
s = "hello \
world"

# 多行字符串可以时候用三个单引号或者三个双引号，内容中的格式将会被保留
s = '''hello
world'''

# 转义字符 \
s = 'hello \'world\''

# 忽略转移字符 将忽略转义字符 \
s = r'abc\def'

# 字符串拼接
s = 'hello' + 'world'

# 字符串格式化, 格式化占位符使用与C语言中的格式化相同
s = 'Say : %s from %s' % (s, 'tom')
# 小数格式化%f，保留两位%.2f
s = 'float : %.2f' % 12.346

# 格式化字符串, 字符串内的{x}, x必须是赋值过的有效变量
a = 'tom'
b = 'cat'
s = f'hello {a}, {b}'
print(s)
b = 'b'
# 下面4种方式效果相同
print('a '+b+' c')
print('a',b,'c')
print('a %s c' % b)
print(f'a {b} c')

print('hello {} {}'.format('world', 'oh'))

# 字符串复制, 相当于输出两个b
print(b * 2)

# bool 值， True相当于1，False相当于0
a = True
b = False
print(a, b)

# None 空值，不存在
a = None
print(a)

# 类型检查
print(type(a), type(b), type(s))
# is xx ,  is not xx, 比较的是对象id，也就是内存地址。 == 和 !== 比较的是值是否相等
print(type(b) is bool)
print(a is None)

# 一切皆对象，python中的对象数据结构都有如下结构：
# id: 对象id，就是对象的内存地址， 通过id(x)函数查看， 一旦创建不可变
# type: 对象类型，如bool、int、float、str等，通过type(x)函数查看类型
# value: 值， 存储的具体值，可变
print(id(a))

# 类型转换 int(x) float(x) bool(x) str(x)
a = True
print(type(a), type(int(a)), int(a), str(a))

# 算数运算 + - * **(幂) / //(整除) %(取模)
a = 2 + 3 * 3 - 2 ** 2 / 2 // 3
# 根号a
a = a ** 0.5
a += 10
a **= 2
a //= 3
print(a)

# 逻辑运算符 and or not，与或非
a = not 1 and False or True
print(a)
